﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Windows.Forms;
using System.Drawing;
using Noris.Schedule.Support.Core;
using Noris.Schedule.UI.Components;
using Noris.Schedule.Support.Expressions;

namespace Noris.Schedule.UI.Expressions
{
    /// <summary>
    /// Panel pro interaktivní zadání fontu a dalších parametrů zobrazování
    /// </summary>
    public class VisualSettingPanel : DPanel
    {
        #region Konstrukce
        /// <summary>
        /// Konstruktor
        /// </summary>
        public VisualSettingPanel()
        {
            this.Initialize();
        }
        /// <summary>
        /// Inicializace objektu
        /// </summary>
        protected void Initialize()
        {
            this.SuspendLayout();

            this.Name = "VisualSettingPanel";

            this.CreateInnerObjects();

            string serialized = this.Serialized;         // Font a barva se serializuje,
            this.Serialized = serialized;                //  a deserializuje podle pravidel (tím se korektně promítně do controlů)

            this.ResumeLayout(false);
            this.PerformLayout();
        }
        /// <summary>
        /// Vytvoří vnitřní objekty
        /// </summary>
        protected void CreateInnerObjects()
        {
            this.Size = new System.Drawing.Size(400, 56);

            this.FontSelect = new FontSelectPanel();
            this.VisibleLabel = new DLabel();
            this.VisibleCombo = new DComboBox();
            this.Controls.Add(this.FontSelect);
            this.Controls.Add(this.VisibleLabel);
            this.Controls.Add(this.VisibleCombo);

            // FontSelect
            this.FontSelect.Anchor = AnchorStyles.Top | AnchorStyles.Left; // | AnchorStyles.Right;
            this.FontSelect.Location = new Point(0, 3);
            this.FontSelect.TextPosition = 72;
            this.FontSelect.TabIndex = 1;
            this.FontSelect.SelectedFontChanged += new EventHandler(FontSelect_SelectedFontChanged);

            // VisibleLabel
            this.VisibleLabel.AutoSize = true;
            this.VisibleLabel.Location = new Point(3, 36);
            this.VisibleLabel.Text = "Zobrazit text:";

            // VisibleCombo
            this.VisibleCombo.Location = new Point(72, 32);
            this.VisibleCombo.Size = new Size(250, 23);
            this.VisibleCombo.DropDownStyle = ComboBoxStyle.DropDownList;
            this.VisibleCombo.FillDComboItems(new DComboItem[] { 
                new DComboItem("Vždy", ConfiguredVisibleMode.VisibleAllways, "Popisek bude zobrazován vždy, bez ohledu na stav prvku."),
                new DComboItem("Jen pro aktivní události", ConfiguredVisibleMode.VisibleOnlyActive, "Popisek bude zobrazován pouze tehdy, když prvek bude pod myší, nebo bude vybrán."),
                new DComboItem("Nikdy", ConfiguredVisibleMode.Hidden, "Popisek nebude zobrazován nikdy."),
                new DComboItem("Podle definice grafu", ConfiguredVisibleMode.Default, "Volbu zobrazování řídí definice grafu")});
            this.VisibleCombo.DComboBoxChanged += new DComboBoxChangedHandler(VisibleCombo_DComboBoxChanged);
        }
        protected FontSelectPanel FontSelect;
        protected DLabel VisibleLabel;
        protected DComboBox VisibleCombo;
        #endregion
        #region Public property a eventy
        /// <summary>
        /// Kompletní serializovaná data
        /// </summary>
        [Category("FontSelectPanel")]
        [Description("")]
        public virtual string Serialized
        {
            get { return this.GetSerialized(); }
            set { this.SetSerialized(value); }
        }
        /// <summary>
        /// Režim viditelnosti
        /// </summary>
        public ConfiguredVisibleMode SelectedVisibleMode
        {
            get { return this.GetVisibleMode(); }
            set { this.SetVisibleMode(value); }
        }
        /// <summary>
        /// Událost po změně nastavení
        /// </summary>
        public event EventHandler SettingChanged;
        /// <summary>
        /// Vyvolá event SettingChanged = po změně nastavení
        /// </summary>
        protected virtual void OnSettingChanged()
        {
            if (this.SettingChanged != null)
                this.SettingChanged(this, EventArgs.Empty);
        }
        #endregion
        #region Protected property a eventy
        protected virtual string GetSerialized()
        {
            string serial = this.FontSelect.Serialized;
            ConfiguredSetting setting = new ConfiguredSetting(serial);       // Objekt (ConfiguredSetting) odpovídající fontu a barvě
            setting.VisibleMode = this.SelectedVisibleMode;                  // Do objektu doplním zdejší režim viditelnosti
            return setting.Serial;
        }
        protected virtual void SetSerialized(string value)
        {
            this.FontSelect.Serialized = value;
            ConfiguredSetting setting = new ConfiguredSetting(value);        // Objekt (ConfiguredSetting) odpovídající serializovanému textu
            this.SelectedVisibleMode = setting.VisibleMode;
        }
        /// <summary>
        /// Vrátí aktuální režim viditelnosti, podle SelectedItem v combo boxu
        /// </summary>
        /// <returns></returns>
        private ConfiguredVisibleMode GetVisibleMode()
        {
            return ReadModeFromItem(this.VisibleCombo.SelectedDItem);
        }
        /// <summary>
        /// Nastaví SelectedItem v combo boxu aby zobrazoval danou hodnotu
        /// </summary>
        /// <param name="value"></param>
        private void SetVisibleMode(ConfiguredVisibleMode value)
        {
            this.VisibleCombo.SelectDItem(item => ReadModeFromItem(item) == value);
        }
        /// <summary>
        /// Vrátí režim viditelnosti, který je uložený v prvku comboboxu (item)
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        private ConfiguredVisibleMode ReadModeFromItem(DComboItem item)
        {
            if (item != null && item.Data is ConfiguredVisibleMode)
                return (ConfiguredVisibleMode)item.Data;
            return ConfiguredVisibleMode.None;
        }
        /// <summary>
        /// Událost po změně fontu
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FontSelect_SelectedFontChanged(object sender, EventArgs e)
        {
            this.OnSettingChanged();
        }
        /// <summary>
        /// Událost po změně viditelnosti
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void VisibleCombo_DComboBoxChanged(object sender, DComboBoxChangedArgs args)
        {
            this.OnSettingChanged();
        }
        #endregion

    }
}
